# -*- coding: utf-8 -*-
#!/usr/bin/python

#------------------------------------------------------------------------

## @package     piece
## \brief       gestion du type abstrait type "piece"
## \author      Pierrick Troadec et Kawtar Hssain
## \date        28/12/2011
## \version     1.2
## \copyright   license BSD

#------------------------------------------------------------------------

#    Importations
#  -----------------

import primitives as prims
import prof as _prof
from constante import *
import porte

#   Fonctions
#  -----------------

## Constructeur du type abtrait "piece"
##@param position       : position ou va etre cree la pièce 
##@param longueur       : longueur de la pièce
##@param largeur        : largeur de la pièce
##@param hauteur        : hauteur de la pièce
##@param texture        : texture des murs de la piece
##@param portes         : indication des ouverture à pratiquer dans les murs en fonction des flags:
#   - NORD
#   - SUD
#   - EST
#   - OUEST 
##@param prof           : professeur situé dans la pièce
##@param nord           : indique si la porte nord est ouverte
##@param sud            : indique si la porte sud est ouverte
##@param est            : indique si la porte est est ouverte
##@param ouest          : indique si la porte ouest est ouverte
##@return piece         : piece initialisé
def creerPiece(position = (0,0,0), longueur = 10, largeur = 10, hauteur = 3, texture = textureMur, portes = 0, prof = None, nord = False, sud = False, est = False, ouest= False) :
	

	piece = {}
	
	piece["position"]   = position
	piece["longueur"]   = longueur
	piece["largeur"]    = largeur
	piece["hauteur"]    = hauteur
	piece["portes"]     = portes
	piece["texture"]    = texture
	piece["listePorte"]  = []
	piece["prof"] = prof
	piece["plafond"] = None
	
	if portes&1:
			piece["listePorte"].append(porte.creerPorte(flag = NORD, ouvert = nord))
	else:
			piece["listePorte"].append(None)
			
	if portes>>1&1:
			piece["listePorte"].append(porte.creerPorte(flag = SUD, ouvert = sud))
	else:
			piece["listePorte"].append(None)
			
	if portes>>2&1:
			piece["listePorte"].append(porte.creerPorte(flag = EST, ouvert = est))
	else:
			piece["listePorte"].append(None)
			
	if portes>>3&1:
			piece["listePorte"].append(porte.creerPorte(flag = OUEST, ouvert = ouest))
	else:
			piece["listePorte"].append(None)
	
	return piece


	
## Affichage d'un piece
##@param piece : piece à afficher
##@param rep   : répétition de la texture des murs
def dessinerPiece(piece, rep = 1):

	x = piece["position"][0]
	z = piece["position"][2]
	w = piece["largeur"]
	w2 = piece["longueur"]
	h = piece["hauteur"]
	texture = piece["texture"]
	flag = piece["portes"]

	
	if flag&1:
		#porte nord
		prims.afficherRectangle(position=(x+w/4.0+.5, 0.0, z+w2),angle=0.0,dimensions=(w/2-1, h),texture=texture, rep=rep) 
		prims.afficherRectangle(position=(x-w/4.0-.5, 0.0, z+w2),angle=0.0,dimensions=(w/2.0-1, h),texture=texture, rep=rep)
		prims.afficherRectangle(position=(x, 2.0, z+w2),angle=0.0,dimensions=(2, 1),texture=texture, rep=rep) 

	else:
		prims.afficherRectangle(position=(x,0.0,z+w2),angle=0.0,dimensions=(w, h),texture=texture, rep=rep) #mur nord
		
	if (flag>>1)&1:
		#porte sud
		prims.afficherRectangle(position=(x+w/4.0+.5, 0.0, z),angle=0.0,dimensions=(w/2-1, h),texture=texture, rep=rep) 
		prims.afficherRectangle(position=(x-w/4.0-.5, 0.0, z),angle=0.0,dimensions=(w/2-1, h),texture=texture, rep=rep)
		prims.afficherRectangle(position=(x, 2.0, z),angle=0.0,dimensions=(2, 1),texture=texture, rep=rep) 

	else:
		prims.afficherRectangle(position=(x, 0.0, z),angle=0.0,dimensions=(w, h),texture=texture, rep=rep) #mur sud
	
	if (flag>>2)&1:
		#porte est
		prims.afficherRectangle(position=(x-w/2, 0.0, z+w2/2+w2/4.0+.5),angle=-90.0,dimensions=(w2/2-1, h),texture=texture, rep=rep) 
		prims.afficherRectangle(position=(x-w/2, 0.0, z+w2/4.0-.5),angle=-90.0,dimensions=(w2/2-1, h),texture=texture, rep=rep)
		prims.afficherRectangle(position=(x-w/2, 2.0, z+w2/2),angle=-90.0,dimensions=(2, 1),texture=texture, rep=rep) 

	else:
		prims.afficherRectangle(position=(x-w/2,0.0,z+w2/2),angle=90.0,dimensions=(w2, h),texture=texture, rep=rep) #mur est

	
	if (flag>>3)&1:
		#porte ouest
		prims.afficherRectangle(position=(x+w/2, 0.0, z+w2/2+w2/4.0+.5),angle=-90.0,dimensions=(w2/2-1, h),texture=texture, rep=rep) 
		prims.afficherRectangle(position=(x+w/2, 0.0, z+w2/4.0-.5),angle=-90.0,dimensions=(w2/2-1, h),texture=texture, rep=rep)
		prims.afficherRectangle(position=(x+w/2, 2.0, z+w2/2),angle=-90.0,dimensions=(2, 1),texture=texture, rep=rep) 

	else:
		prims.afficherRectangle(position=(x+w/2,0.0,z+w2/2),angle=90.0,dimensions=(w2, h),texture=texture, rep=rep) #mur ouest


	
	prims.afficherPlafond(position=(x,h,z+w2/2), texture=piece["plafond"] ,dimensions=(w, w2))
	prims.afficherPlafond(position=(x,0.01,z+w2/2), texture=sol, dimensions=(w, w2), rep = 1)
	
	_prof.dessinerProf(piece["prof"])
	
	for ported in piece["listePorte"]:
		if ported != None:
			porte.dessinerPorte(piece, ported)


## Ouverture des porte d'une piece
##@param piece : pièce dont les portes vont être ouverte
def ouverture(piece):
	for ported in piece["listePorte"]:
		if ported != None:
			ported["ouverte"] = True

## Recherche de potentiel pièce en vue de la gestion des collisions
##@param x            : position en abscisse du joueur
##@param z            : position en ordonnee du joueur
##@param batiment : liste des différentes pièces constituant le bâtiment
##@return compteur    :
#   - si le joueur se trouve dans une pièce on retourne son id 
#   - sinon on retourne 99
def numPiece(x, z, batiment):

	compteur = 0
	
	for piece in batiment:
			if not((x > piece["position"][0] + piece["largeur"]/2) or ( x < piece["position"][0] - piece["largeur"]/2) or ( z < piece["position"][2]) or ( z > piece["position"][2] + piece["longueur"])):
				return compteur
			compteur+=1
	
	return 99
